package com.monkarapps.controller;


import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import com.monkarapps.bean.Aplicacion;
import com.monkarapps.bean.Compra;
import com.monkarapps.bean.Sub_categoria;
import com.monkarapps.bean.Usuario;
import com.monkarapps.constants.Constants;
import com.monkarapps.service.AplicacionImplementacion;
import com.monkarapps.service.CategoriaImplementacion;
import com.monkarapps.service.CompraImplementacion;

@ManagedBean
//@RequestScoped
@SessionScoped
public class AplicacionBB implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6740514196088979953L;
	private List<Aplicacion> listaAplicaciones;
	private List<Aplicacion> listaTopCabecera;

	private Aplicacion aplicacion;
	private StreamedContent file;
	
	private Aplicacion aplicacion_c;
	private List<Compra> compras;
	private Sub_categoria sc;

	private AplicacionImplementacion aplicacionImp;
	private CompraImplementacion compraImp;
	private CategoriaImplementacion categoriaImp;
	
	private String idCategoria;
		

	private boolean index;
	
	private String ENTORNO;

	// para recibir parametros
	FacesContext facesContext = FacesContext.getCurrentInstance();
	Map params = facesContext.getExternalContext().getRequestParameterMap();

	
	ExternalContext G = FacesContext.getCurrentInstance().getExternalContext();
	HttpSession session = 
		(HttpSession) G.getSession(true);
	
	// constructor
	public AplicacionBB() {
		aplicacionImp = new AplicacionImplementacion();
		compraImp= new CompraImplementacion();
		categoriaImp = new CategoriaImplementacion();
		index = false;
		listaAplicaciones= new ArrayList<Aplicacion>();
		filtrarAplicaciones("empty");
		if(index){
			obtenerAplicacionesCabecera();
			
		}
		
		
		

	}
	
	public void misAplicaciones() throws Exception{
		
		filtrarAplicaciones("MisDescargas");
		Constants.mostrarMensaje("Filtrado por", "Mis Aplicaciones Descargadas", Constants.INFO);
	}
	public void subirAplicacion() throws Exception{
		System.out.println("ENTRO A MIS UP");
	}
	public void moderar() throws Exception{
		System.out.println("ENTRO A MIS MOD");
	}
	
	public void listarVacio() throws Exception{
		filtrarAplicaciones("empty");
	}
	
	public void listarMasDescargados() throws Exception{
		System.out.println("ENTRO A LISTAR MAS DESCARGADOS");
		filtrarAplicaciones("MasDescargados");
		Constants.mostrarMensaje("Filtrado por", "Mas Descargados", Constants.INFO);
	}
	public void listarMejorValorados() throws Exception{
		filtrarAplicaciones("MejorValorados");
	}
	public void listarDelMomento() throws Exception{
		filtrarAplicaciones("DelMomento");
	}
	
//	aca inicia la ñanga
	
	public void filtrar_Relojes() throws Exception{
		filtrarAplicaciones("Relojes");
	}
	public void filtrar_Calculadora() throws Exception{
		filtrarAplicaciones("Calculadora");
	}
	public void filtrar_Blocks() throws Exception{
		filtrarAplicaciones("Blocks");
	}
	public void filtrar_Puzles() throws Exception{
		filtrarAplicaciones("Puzles");
	}
	public void filtrar_Mesa() throws Exception{
		filtrarAplicaciones("Mesa");
	}
	public void filtrar_Arcade() throws Exception{
		filtrarAplicaciones("Arcade");
	}
	public void filtrar_Academicos() throws Exception{
		filtrarAplicaciones("Academicos");
	}
	public void filtrar_Idiomas() throws Exception{
		filtrarAplicaciones("Idiomas");
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	private void obtenerAplicacionesCabecera() {
		try {
			listaTopCabecera = aplicacionImp
					.listarTopDescargas(Constants.NUMERO_APLICACIONES_CABECERA_MOSTRAR);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	// metodo que filtra por subcategoria
	private void filtrarAplicaciones(String param) {

		try {
			switch (param) {
			case "empty":
				listaAplicaciones = aplicacionImp
						.listar(Constants.NUMERO_APLICACIONES_MOSTRAR);
				index=true;
				break;
			case "MasDescargados":
				listaAplicaciones = aplicacionImp
						.listarTopDescargas(Constants.NUMERO_APLICACIONES_MOSTRAR);
				index=false;
				break;
			case "DelMomento":
				listaAplicaciones =  aplicacionImp
						.listar(Constants.NUMERO_APLICACIONES_MOSTRAR);
				index=false;
				break;
			case "MejorValorados":
				listaAplicaciones = aplicacionImp
						.listarTopValoradas(Constants.NUMERO_APLICACIONES_MOSTRAR);
				index=false;
				break;
			
			case "MisDescargas":
				Usuario usu = (Usuario) session.getAttribute("UsuarioSesion");
				listaAplicaciones = aplicacionImp
						.listarXUsuario(usu);
				index=false;
				break;

			default:
				
				Sub_categoria sub = new Sub_categoria();
				sub.setNombre(param);
				sub = categoriaImp.obtenerXNombre(sub);
				listaAplicaciones = aplicacionImp.filtrarXSub_categoria(sub);
				index=false;
				break;
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void  mostrarDetalles(ActionEvent event) throws Exception{
		 
		String xxx  = event.getComponent().getAttributes().get("idAplicacion").toString();
		 
		 Aplicacion app = new Aplicacion();
		 app.setIdAplicacion(Integer.parseInt(xxx));
//		 
		 app= aplicacionImp.obtenerAplicacion(app);
		 List<Compra> comprasActuales= app.getCompras();
		 
		 List<Compra> comprasDespues = new ArrayList<Compra>();
		 
		 Usuario usu = new Usuario();
		 usu.setIdUsuario(99999);
		 if(session.getAttribute("UsuarioSesion")!=null){
			 usu=(Usuario) session.getAttribute("UsuarioSesion");
		 }
		 
		 for(Compra c: comprasActuales){
			 if(c.getComentado()>0){
				 comprasDespues.add(c);
			 }
			 else{
//				 para guardar e lcomentario del usuario con respecto a la aplicacion
				 if(c.getUsuario().getIdUsuario()==usu.getIdUsuario()){
					 System.out.println("El usuario tiene una compra no comentada");
					 session.setAttribute("Comentario",c);
				 }
			 }

		 }
		 
		 
//		 comprobar que se refiera a la misma aplicacion
		 Compra c = new Compra();
		 c.getAplicacion().setIdAplicacion(9999999);
		 if(session.getAttribute("Comentario")!=null){
			 System.out.println("Existe un comentario en sesion");
			 c = (Compra) session.getAttribute("Comentario");
		 }
		 
//		 ahora verifico que se refiera al a misma app
		 if(app.getIdAplicacion()!=c.getAplicacion().getIdAplicacion()){
			 System.out.println("no es la misma aplicacion : "+c.getAplicacion().getIdAplicacion()+" / "+app.getIdAplicacion());
			 session.removeAttribute("Comentario");
		 }
		 
		 app.setCompras(comprasDespues);
		 session.setAttribute("aplicacionMostrada", app);
		 
		 aplicacion = aplicacionMostrada();
		 
		 
//		 
//		 facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Éxito ","blablabal")); 
	}
	
	public Aplicacion aplicacionMostrada(){
		Aplicacion apli = new Aplicacion();
		try{
			apli=(Aplicacion)session.getAttribute("aplicacionMostrada");
			
		}catch (Exception e) {
			// TODO: handle exception
		}
		return apli;
	}
	

	
	
	
	public String comprarAplicacion() throws Exception{
		System.out.println("JOJOJOJOOJ");
		String resultadoCompra="";
		try {
		Compra compra = new Compra();
		compra.setAplicacion(aplicacionMostrada());
		compra.setUsuario((Usuario)session.getAttribute("UsuarioSesion"));
		
		
		resultadoCompra = compraImp.grabar(compra);
		
		String ms="Aplicación "+compra.getAplicacion().getNombre()+" comprada con éxito :] ";
		Constants.mostrarMensaje("Descarga Exitosa :]", ms, Constants.INFO);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "";
		
		
	}
	

	// GETTERS AND SETTERS
	public List<Aplicacion> getListaAplicaciones() {
		return listaAplicaciones;
	}

	public void setListaAplicaciones(List<Aplicacion> listaAplicaciones) {
		this.listaAplicaciones = listaAplicaciones;
	}

	public Aplicacion getAplicacion() {
		return aplicacion;
	}

	public void setAplicacion(Aplicacion aplicacion) {
		this.aplicacion = aplicacion;
	}

	public List<Compra> getCompras() {
		return compras;
	}

	public void setCompras(List<Compra> compras) {
		this.compras = compras;
	}

	public List<Aplicacion> getListaTopCabecera() {
		return listaTopCabecera;
	}

	public void setListaTopCabecera(List<Aplicacion> listaTopCabecera) {
		this.listaTopCabecera = listaTopCabecera;
	}

	public boolean isIndex() {
		return index;
	}

	public void setIndex(boolean index) {
		this.index = index;
	}

	public Aplicacion getAplicacion_c() {
		return aplicacion_c;
	}

	public void setAplicacion_c(Aplicacion aplicacion_c) {
		this.aplicacion_c = aplicacion_c;
	}

	public String getIdCategoria() {
		return idCategoria;
	}

	public void setIdCategoria(String idCategoria) {
		this.idCategoria = idCategoria;
	}

	public StreamedContent getFile() throws FileNotFoundException {
		
		try{
			Aplicacion app = (Aplicacion) session.getAttribute("aplicacionMostrada");
			 InputStream stream = ((ServletContext)FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream("/apps/"+app.getRuta_aplicacion());
			 file = new DefaultStreamedContent(stream, "application/pdf", "downloaded_app1.pdf");
		}catch (Exception e) {
			System.out.println("ERROR AL LEER EL ARCHIVO");
			// TODO: handle exception
		}
		
		return file;
	}

	public void setFile(StreamedContent file) {
		this.file = file;
	}


	
	
}
